package com.zhangyx.crawler.core.browser;

import com.google.common.collect.Maps;
import org.openqa.selenium.chrome.ChromeOptions;

import java.util.HashMap;
import java.util.Map;

public class ConfigChrome {
    private ChromeOptions options;

    public static ConfigChrome build() {
        return new ConfigChrome();
    }
    private ConfigChrome() {
        options = new ChromeOptions();
    }
    /**
     * 暂时只支持http
     * --proxy-server=http://127.0.0.1:1080
     * @param host
     * @param port
     * @return
     */
    public ConfigChrome addProxy(String host, int port) {
        options.addArguments("--proxy-server=http://" + host + ":" + port);
        return this;
    }

    /**
     * 无头运行。不进行图形化显示
     *
     * @return
     */
    public ConfigChrome headLess() {
        options.addArguments("--headless");
        return this;
    }

    /**
     * 窗口最大化
     *
     * @return
     */
    public ConfigChrome maxSize() {
        options.addArguments("--start-maximized");
        return this;
    }

    /**
     * 禁止使用扩展程序
     *
     * @return
     */
    public ConfigChrome disableExtensions() {
        options.addArguments("--disable-extensions");
        return this;
    }

    /**
     * 隐身模式。在浏览结束后，会清除浏览记录（包括一些缓存文件）。
     *
     * @return
     */
    public ConfigChrome incognito() {
        options.addArguments("--incognito");
        return this;
    }

    /**
     * 禁止发现扩展程序。在某些情况下，网站通过检测扩展能够判断出是否为非法访问
     *
     * @return
     */
    public ConfigChrome disablePluginsDiscover() {
        options.addArguments("--disable-plugins-discover");
        return this;
    }

    /**
     * 禁止加载图片
     *
     * @return
     */
    public ConfigChrome disableLoadImage() {
        Map<String, Object> prefs = new HashMap<String, Object>();
        prefs.put("profile.managed_default_content_settings.images", 2);
        options.setExperimentalOption("prefs", prefs);
        return this;
    }

    /**
     * 允许该url加载图片
     *
     * @param url 正确格式：www.baidu.com。其他如：www.baidu.com/pic等url，均无效。chrome是根据域名进行控制的。
     * @return
     */
    public ConfigChrome controlLoadImage(String url,Boolean enable) {
        Map<String, Object> prefs = (Map<String, Object>) options.getExperimentalOption("prefs");
        if (prefs == null) {
            prefs = Maps.newHashMap();
        }
        Map<String, Map<String, Integer>> stringMapMap = Maps.newHashMap();
        Map<String, Integer> stringIntegerMap = Maps.newHashMap();
        if (enable) {
            stringIntegerMap.put("setting", 1);
        }else {
            stringIntegerMap.put("setting", 2);
        }

        stringMapMap.put(url + ",*", stringIntegerMap);
        prefs.put("profile.content_settings.exceptions.images", stringMapMap);
        options.setExperimentalOption("prefs", prefs);
        return this;
    }

    public ChromeOptions getOptions() {
        return options;
    }

    /**
     * 默认配置
     *
     * @return
     */
    public ChromeOptions getDefault() {
        return ConfigChrome.build()
                .disableExtensions()
                .disablePluginsDiscover()
                .incognito()
                .maxSize()
                .getOptions();
    }
}
